package com.jxtc.enterprise.common.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.jxtc.enterprise.admin.dto.AdminOrderStatisticDTO;
import com.jxtc.enterprise.admin.dto.AdminOrderStatisticForAdminDTO;
import com.jxtc.enterprise.common.entity.OrderPayment;
import com.jxtc.enterprise.hr.dto.OrderDetailDTO;
import com.jxtc.enterprise.hr.dto.OrderStatisticDTO;
import com.jxtc.enterprise.merchant.dto.*;
import com.jxtc.enterprise.merchant.dto.order_manage.StoreInfoForOrderDTO;
import com.jxtc.enterprise.employee.dto.OrderCountItemDTO;
import com.jxtc.enterprise.tenant.dto.TenantOrderDetailDTO;
import com.jxtc.enterprise.tenant.dto.TenantOrderStatisticDTO;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDate;
import java.util.List;

public interface OrderMapper extends BaseMapper<OrderPayment> {

    /**
     * 根据公司 ID 和时间范围分页查询订单统计数据
     *
     * @param page      分页规则
     * @param companyId 公司 ID
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return 分页后的订单统计数据
     */
    Page<OrderStatisticDTO> queryOrderStatistic(Page<OrderStatisticDTO> page,
                                                @Param("companyId") String companyId,
                                                @Param("startTime") LocalDate startTime,
                                                @Param("endTime") LocalDate endTime);

    /**
     * 根据公司 ID 和日期查询当日订单详情
     *
     * @param page      分页规则
     * @param companyId 公司 ID
     * @param date      查询日期
     * @return 分页后的订单详情数据
     */
    Page<OrderDetailDTO> queryOrderDetail(Page<OrderDetailDTO> page,
                                          @Param("companyId") String companyId,
                                          @Param("date") LocalDate date);


    /**
     * 根据公司 ID 和日期以及餐食类型查询当日订单详情
     *
     * @param page      分页规则
     * @param companyId 公司 ID
     * @param date      订单所属日期
     * @param meal      餐食类型
     * @return 分页后的订单详情数据
     */
    Page<OrderDetailDTO> queryOrderDetailForAdmin(Page<OrderDetailDTO> page,
                                                  @Param("companyId") String companyId,
                                                  @Param("date") LocalDate date,
                                                  @Param("meal") String meal);


    /**
     * 租户根据公司 ID 和日期以及餐食类型查询当日订单详情
     *
     * @param page      分页规则
     * @param companyId 公司 ID
     * @param date      订单所属日期
     * @param meal      餐食类型
     * @return 分页后的订单详情数据
     */
    Page<TenantOrderDetailDTO> queryOrderDetailForTenant(Page<TenantOrderDetailDTO> page,
                                                         @Param("companyId") String companyId,
                                                         @Param("date") LocalDate date,
                                                         @Param("meal") String meal);


    /**
     * 统计指定租户所管理的不同公司在指定时间范围内的订单数据（点餐份数、总金额及需要支付给商铺的金额）
     *
     * @param page      分页参数
     * @param tenantId  指定租户
     * @param keyword   公司名称关键字
     * @param startTime 查询开始时间
     * @param endTime   查询结束时间
     */
    Page<TenantOrderStatisticDTO> queryOrderStatisticForTenant(Page<TenantOrderStatisticDTO> page,
                                                               @Param("tenantId") String tenantId,
                                                               @Param("keyword") String keyword,
                                                               @Param("startTime") LocalDate startTime,
                                                               @Param("endTime") LocalDate endTime);


    /**
     * 相比于租户查询订单列表，管理员多一个租户名称的查询字段
     *
     * @param page       分页参数
     * @param keyword    公司名称关键字
     * @param tenantName 租户名称关键字
     * @param startTime  查询开始时间
     * @param endTime    查询结束时间
     */
    Page<AdminOrderStatisticForAdminDTO> queryOrderStatisticForAdminByTenantName(
            Page<AdminOrderStatisticDTO> page,
            @Param("keyword") String keyword,
            @Param("tenantName") String tenantName,
            @Param("startTime") LocalDate startTime,
            @Param("endTime") LocalDate endTime
    );

    /**
     * 根据用户 ID、公司 ID 以及手机号查询各状态订单数量
     *
     * @param userId        用户 ID
     * @param companyIdList 可点餐公司 ID 列表
     * @param phone         手机号
     * @return 各状态订单数量列表
     */
    List<OrderCountItemDTO> queryOrderCount(@Param("userId") String userId,
                                            @Param("companyIdList") List<String> companyIdList,
                                            @Param("phone") String phone);


    /**
     * 查询出店铺 ID 为 storeId 的店铺的订单详情，并按照 storeId 进行分组，统计:
     * 1. 订单状态为 "已完成" 的订单应该支付给店铺的总金额
     * 2. 总订单数量："已完成" 的订单数 + "售后已处理" 的订单数，一个订单可能对应多个订单详情，所以订单 ID 要去重
     * 3. "售后已处理" 的订单数
     *
     * @param storeId   店铺 ID
     * @param startDate 开始统计时间
     * @param endDate   结束统计时间
     * @return 店铺的营业相关数据
     */
    StoreSaleSummaryDTO queryStoreSaleSummaryByStoreId(@Param("storeId") String storeId,
                                                       @Param("startDate") String startDate,
                                                       @Param("endDate") String endDate);


    /**
     * 根据 storeId 分页查询店铺每天的营业数据
     *
     * @param storeId   店铺 ID
     * @param startDate 开始统计时间
     * @param endDate   结束统计时间
     * @return 分页后的店铺每天的营业数据
     */
    List<StoreDailyDataDTO> queryStoreDailyData(@Param("storeId") String storeId,
                                                @Param("startDate") String startDate,
                                                @Param("endDate") String endDate);


    /**
     * 根据 storeId 和 date 查询指定日期店铺的已完成订单详情列表，并按下单时间降序排列
     *
     * @param storeId 店铺 ID
     * @param date    日期，yyyy-MM-dd 格式
     * @return 指定日期店铺的已完成订单详情列表
     */
    List<StoreDailyOrderDetailDTO> queryStoreCompletedOrderDetailByDateAndStoreId(@Param("storeId") String storeId,
                                                                                  @Param("date") String date);

    /**
     * 根据 storeId 和 date 查询指定日期店铺的售后已处理订单详情列表，并按下单时间降序排列
     *
     * @param storeId 店铺 ID
     * @param date    日期，yyyy-MM-dd 格式
     * @return 指定日期店铺的售后已处理订单详情列表
     */
    List<StoreDailyAfterOrderDetailDTO> queryStoreAfterSaleOrderDetailByDateAndStoreId(@Param("storeId") String storeId,
                                                                                       @Param("date") String date);

    /**
     * 根据 storeId 查询出 startDate 至 endDate 日期范围内（包含两端）的店铺的订单详情（已完成和售后已处理状态的订单）列表，
     * 并按订单所属日期降序排列，若订单所属日期相同，"已完成" 状态的订单排在 "售后已处理" 状态的订单前面，最后按照下单时间降序排列
     *
     * @param storeId   店铺 ID
     * @param startDate 开始日期
     * @param endDate   结束日期
     * @return 指定日期范围内店铺的订单详情列表
     */
    List<ExportStoreDailyDataDTO> queryStoreOrderDetailByDateAndStoreId(@Param("storeId") String storeId,
                                                                        @Param("startDate") String startDate,
                                                                        @Param("endDate") String endDate);


    /**
     * 【1103新增功能】根据多个订单id，查询出这些订单是来自那个店铺，此份订单需要给商户的费用，用来作为 导出管理页面，导出excel表格数据中，新增的【店铺名】，【支付给商家的费用】 两列的值
     *
     * @param orderIds
     * @return
     */
    List<StoreInfoForOrderDTO> queryOrderStoreInfoByOrderIds(@Param("orderIds") List<String> orderIds);


    List<OrderPayment> queryOrderByPickupCodeAndCompanyIds(
            @Param("pickupCode") Integer pickupCode,
            @Param("dateFlag") String dateFlag,
            @Param("companyIdList") List<String> companyIdList
    );

    List<String> queryAlreadyAssignedLockerBoxNo(@Param("companyId") String companyId, @Param("dateFlag") String dateFlag, @Param("mealFlag") String mealFlag);
}
